package cn.itcast.producer;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

/**
 * 路由消息生产者
 *
 * @author lee.siu.wah
 * @version 1.0
 * <p>File Created at 2020-11-24<p>
 */
@Component
public class DirectProducer {

    @Resource
    private RabbitTemplate rabbitTemplate;
    @Value("${log.direct}")
    private String exchange;

    // 回调确认对象
    private RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        // 确认方法
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            // correlationData: 相关数据对象
            // ack: 判断消息是否成功发送
            // cause: 失败原因
            System.out.println("ack = " + ack);
            System.out.println("cause = " + cause);
            if (ack){ // 成功
                System.out.println("消息已投递成功！");
                System.out.println("correlationData.getId() = " + correlationData.getId());
                // 修改消息表中的消息发送的状态
            }else {
                System.out.println("消息已投递失败: " + correlationData.getId());
            }
        }
    };

    // 生产消息方法
    public void logMessage(String routingKey){
        // 定义消息
        String msg = "路由模式,时间：" + new Date();

        // 设置回调确认对象
        rabbitTemplate.setConfirmCallback(confirmCallback);
        // 设置相关的数据
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId("1001");
        /**
         * String exchange 交换机
         * String routingKey 路由键
         * Object message 消息内容
         */
        rabbitTemplate.convertAndSend(exchange, routingKey, msg, correlationData);
    }
}
